Leetcode重点250题思路(Part 3)

本文的选题依据来自 https://cspiration.com/leetcodeClassification 中的划分,下面的序号以 Leetcode 英文版为准

⭐31.Next Permutation

lfWqNq.png
lffwan.png

  • 以 127431 为例,其全排列的下一个字符是 131247
  • 先找到升序序列中倒数第二大的数字,再查找比该数大的最小的数,交换两数,以交换位置+1 为起点翻转后续的所有数字

32.Longest Valid Parentheses

lfoF10.png
lfoe74.png

  • 涉及到括号匹配的问题一般用栈来处理,当遇到左括号时就将其入栈,如果遇到右括号,则先判断栈是否为空,因为如果栈为空则表示没有左括号进来,在没有左括号进来的情况下,出现右括号不符合要求,所以将开始计算的 start 前移;如果栈不为空则将栈内原有的左括号出栈,之后再次判断栈是否为空,如果为空则意味着栈内存在的左括号已经消耗完,那么只需要用当前位置-start 即可得出长度,但是当栈不为空时说明出现了多余的左括号,此时不能减去 start,而是得减去栈顶元素存储的值

33.Search in Rotated Sorted Array

lf7uS1.png
lf73wD.png

  • 该题需要利用题目给定的升序数组的条件,不管它以那个点进行旋转,一定会形成部分升序的状况,所以只需要稍微修改下二分查找方法
  • 如果旋转后的数组正好中点和 target 相等则返回,如果 middle 小于 end 值则意味着 middle 所在的这个子数组是升序数组,那么只需要按照常规情况继续二分查找即可;如果 middle 比 end 大,这意味着 middle 前半段才是升序数组

34.Find First and Last Position of Element in Sorted Array

lfHj8s.png
lfbiaF.png

  • 升序数组查找元素自然使用二分查找,当确定元素之后则以该元素为中心向两边扩散,所以一边 low–,一边 high++,最后赋值。最后需要判断 nums[low]==target 是为了防止出现只有 1 个元素的情况,因为在这种状况下是不会进入循环进行二分查找的

35.Search Insert Position

lfLL5D.png
lfOsRH.png

  • 二分查找

36.Valid Sudoku

lfO5FS.png
lfza5V.png

  • 分别检验九宫格的行、列和子九宫格

37.Sudoku Solver

lhJ790.png
lhY99x.png

  • 该题使用 DFS 进行暴力求解
  • 通过两个 for 循环遍历每个空格,之后为每个标记为点的空格填入一个数字,判断它是否满足要求,如果满足则填入,不满足则退出时重新填入点

38.Count And Say

lhUqi9.png
lhUzqO.png

  • 该题使用暴力法解决,从字符串开头进行遍历,当没有到达字符串结尾时,如果遇到不同字符则重置计数变量 count

39.Combination Sum

lhasQx.png
lhaXkQ.png

  • 该题使用递归解决。以{2,3,6,7}和 target=7 为例,首先进入循环,则 2 加入 list,此时 target 变成 5,之后 2 再次加入 list,此时 target 变成 3,之后加入 2,target 变成 1,再加入 2,此时 target 变成-1,所以退出递归,此时 list 中有 4 个 2,执行 remove 操作,保留 3 个 2,然后继续 for 循环,循环到 3,则组成{2,2,3},满足要求,退出递归,变成{2,2},之后变成{2,2,6},{2,2,7}都不符合,所以循环退出,继续 remove,只剩下一个{2};按照上述规则继续循环即可得到所有解决
  • 该题需要注意加入和 remove 的时机,这也是递归题目中常见的操作

40.Combination Sum II

lh0Jyt.png
lh0yyq.png

  • 该题和上题的唯一区别就是数组有重复元素,和其他数组重复元素题目类似,直接排序,然后利用 if 过滤重复条件即可